MapStruct একটি শক্তিশালী model mapping টুল যা JavaBeans বা POJOs এর মধ্যে ডেটা ম্যাপিং করতে ব্যবহৃত হয়। এটি অটোমেটিক কোড জেনারেশন করে, যা দ্রুত এবং কার্যকরী ডেটা ট্রান্সফার সরবরাহ করে। তবে, null values এর ক্ষেত্রে সঠিক হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ, কারণ null ম্যাপিংয়ের কারণে NullPointerException বা ভুল মান ট্রান্সফারের মতো সমস্যা হতে পারে।
এই টিউটোরিয়ালে, আমরা দেখব MapStruct এ কিভাবে null values সঠিকভাবে হ্যান্ডেল করা যায় এবং কিছু কৌশল ও টিপস শেয়ার করব যা null values এর প্রভাব কমাবে।
১. MapStruct এ Default Null Handling
MapStruct স্বাভাবিকভাবে null values হ্যান্ডেল করার জন্য কিছু ডিফল্ট নিয়ম অনুসরণ করে। উদাহরণস্বরূপ, যদি ম্যাপিং করার সময় কোনো ফিল্ডের মান null থাকে, তবে সেটি null হিসেবেই রিটার্ন করবে।
উদাহরণ:
public class Employee {
private String name;
private Integer age;
// Getters and Setters
}
public class EmployeeDTO {
private String name;
private Integer age;
// Getters and Setters
}
@Mapper
public interface EmployeeMapper {
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, যদি Employee অবজেক্টের name বা age ফিল্ড null থাকে, তবে EmployeeDTO এর সমান ফিল্ডও null হয়ে যাবে। এই ডিফল্ট null হ্যান্ডলিং খুবই সাধারণ এবং অনেক সময় প্রয়োজনীয় হয়।
২. MapStruct এ Null Handling কাস্টমাইজ করা
MapStruct আপনাকে null values হ্যান্ডলিং কাস্টমাইজ করার সুযোগ দেয়, যাতে আপনি বিশেষ পরিস্থিতিতে null মানের জন্য আলাদা আচরণ নির্ধারণ করতে পারেন। এর জন্য MapStruct @Mapping অ্যানোটেশন ব্যবহার করে কাস্টম nullValueCheckStrategy এবং nullValuePropertyMappingStrategy প্যারামিটার সরবরাহ করে।
২.১ nullValueCheckStrategy
এটি null মান পরীক্ষা করার কৌশল নির্ধারণ করে। সাধারণত, যদি কোনো ফিল্ড null হয়, তবে সেটা null হিসেবে ম্যাপ হবে। কিন্তু আপনি চাইলে null ফিল্ডের জন্য default মান দিতে পারেন।
উদাহরণ: nullValueCheckStrategy
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface EmployeeMapper {
@Mapping(target = "name", source = "name", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, ALWAYS ব্যবহার করা হয়েছে, যা মানে হল যে সব ক্ষেত্রেই null value চেক হবে এবং সেগুলিকে null হিসেবে সেট করা হবে।
২.২ nullValuePropertyMappingStrategy
এই প্যারামিটারটি যখন null মান হয়, তখন ম্যাপিংয়ের কিভাবে হ্যান্ডল করা হবে তা নির্ধারণ করে। আপনি এটি ব্যবহার করে null মানের জন্য default মান নির্ধারণ করতে পারেন, অথবা আপনি চাইলে null মানের ক্ষেত্রে কোনো ফিল্ড মান না সেট করার সিদ্ধান্ত নিতে পারেন।
উদাহরণ: nullValuePropertyMappingStrategy
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface EmployeeMapper {
@Mapping(target = "name", source = "name")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, IGNORE ব্যবহার করা হয়েছে, যা মানে হল যে যদি কোনো প্রপার্টি null থাকে, তবে সেই প্রপার্টি ম্যাপিংয়ে অন্তর্ভুক্ত হবে না।
৩. Null Handling for Nested Objects
কখনও কখনও null values নেস্টেড অবজেক্টের মধ্যে থাকে এবং সেগুলোর সঠিক হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ। MapStruct এর মাধ্যমে আপনি নেস্টেড অবজেক্টগুলির null মান সঠিকভাবে হ্যান্ডেল করতে পারেন।
উদাহরণ: Nested Object Mapping with Null Handling
public class Department {
private String departmentName;
// Getters and Setters
}
public class Employee {
private String name;
private Department department;
// Getters and Setters
}
public class EmployeeDTO {
private String name;
private String departmentName;
// Getters and Setters
}
@Mapper
public interface EmployeeMapper {
@Mapping(source = "department.departmentName", target = "departmentName")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, যদি Employee অবজেক্টের department ফিল্ড null হয়, তবে MapStruct departmentName ফিল্ডে null মান সেট করবে, যদি না nullValuePropertyMappingStrategy দিয়ে অন্য কোনো কৌশল নির্ধারণ করা হয়।
৪. Null Value Handling with Custom Methods
আপনি যদি null মানের জন্য কাস্টম হ্যান্ডলিং চাইলে, তখন আপনাকে custom methods ব্যবহার করতে হবে, যা null চেক করার পরে নির্দিষ্ট মান প্রদান করবে।
উদাহরণ: Custom Method for Null Handling
public class Employee {
private String name;
private Integer age;
// Getters and Setters
}
public class EmployeeDTO {
private String name;
private Integer age;
// Getters and Setters
}
@Mapper
public interface EmployeeMapper {
@Mapping(target = "age", expression = "java(getDefaultAge(employee))")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
default Integer getDefaultAge(Employee employee) {
return (employee.getAge() == null) ? 18 : employee.getAge(); // Return default value if age is null
}
}
এখানে, getDefaultAge মেথডটি ব্যবহার করা হয়েছে, যা null age থাকলে 18 ফিরিয়ে দেবে।
৫. MapStruct এবং NullPointerException
MapStruct এর null value হ্যান্ডলিং কোড জেনারেট করে এবং এতে NullPointerException হওয়া এড়ানো হয়। যদি আপনি কোনো null মানের সাথে কাজ করেন, তবে MapStruct null চেক করে সেই ভ্যালু null হিসেবে ম্যাপ করবে। তবে, যদি আপনি null এর জন্য বিশেষ কাস্টম লজিক চান, তবে উপরের মতো কাস্টম মেথড ব্যবহার করতে পারেন।
সারাংশ
MapStruct এ null values সঠিকভাবে হ্যান্ডেল করা খুবই গুরুত্বপূর্ণ, যাতে ডেটা ট্রান্সফারের সময় কোনো ত্রুটি বা সমস্যা না হয়। MapStruct এর nullValueCheckStrategy এবং nullValuePropertyMappingStrategy প্যারামিটার ব্যবহার করে আপনি null মানের জন্য কাস্টম হ্যান্ডলিং নির্ধারণ করতে পারেন। এছাড়া, custom methods ব্যবহার করে আপনি আরো উন্নত null হ্যান্ডলিং যুক্ত করতে পারেন, যা আপনার প্রোজেক্টের জন্য কার্যকর হতে পারে।
Read more